home *** CD-ROM | disk | FTP | other *** search
-
- /* Robot spider.r per CRobots
-
- Tattica di gioco
-
- Questo robot si posiziona negli angoli e li' vi resta fino a che non
- subisce danni superiori al 6%, dopo di che cambia angolo secondo
- uno schema fisso che gli permette di girare tutto lo schermo.
- E' una tattica difensiva, in quanto il robot cerca di fuggire dalle zone
- calde dello schermo, piuttosto che cercare gli avversari.
- Inoltre se durante i trasferimenti viene colpito inverte momentaneamente
- la rotta, per poi tornare alla rotta originaria.
- L' algoritmo di mira e' lo stesso del robot cube.r: tutto e' affidato ad
- un sottoprogramma invocato iterativamente. Questo cerca i robot
- avversari e, una volta trovati, effettua correzioni al tiro secondo i
- loro spostamenti.
- Le correzioni riguardano sia l' angolo che la gittata, e dalla loro messa
- a punto dipende in modo critico l' efficienza del robot.
-
- Scritto da:
- Mario Gregori Via Calcamuggi 26 Alessandria (Italy)
- Tel: 0131/345024 */
-
-
- /* variabili globali */
-
- int sc_dir; /* direzione dello scanner */
- int sfas; /* sfasamento dell' angolo di fuoco */
- int oldd; /* distanza a cui si trovava l' avversario */
- int dist; /* distanza a cui si trova l' avversario */
- int scd2; /* direzione di un secondo scanner */
- /* (cerca avversari piu' vicini) */
- int danni; /* totale danni subiti */
-
- main()
- {
- sc_dir = 0;
- scd2 = 0;
- sfas = 0;
- danni = 0;
- oldd = 500;
-
- /* Si posiziona nell' angolo in basso a destra */
- while (loc_y() > 80) {
- drive (270, 80);
- look();
- if ((damage() - danni) > 6)
- dietrofront(270);
- }
- drive (0, 0);
- look();
- while (loc_x() < 920) {
- drive (0, 80);
- look();
- if ((damage() - danni) > 6)
- dietrofront(0);
- }
- drive (0, 0);
-
- while (1) {
- /* resta nell' angolo finche' non viene colpito */
- stay();
-
- /* si trasferisce nell' angolo in alto a destra */
- while (loc_y() < 470) {
- drive (112, 80);
- look();
- if ((damage() - danni) > 6)
- dietrofront(112);
- }
- drive (112, 50);
- look();
- while (loc_y() < 920 && loc_x() < 920) {
- drive (68, 80);
- look();
- if ((damage() - danni) > 6)
- dietrofront(68);
- }
- drive (68, 0);
- /* ci resta per un po'... */
- stay();
-
- /* si trasferisce nell' angolo in alto a sinistra */
- while (loc_x() > 530) {
- drive (202, 80);
- if ((damage() - danni) > 6)
- dietrofront(202);
- look();
- }
- drive (202, 50);
- look();
- while (loc_y() < 920 && loc_x() > 80) {
- drive (158, 80);
- if ((damage() - danni) > 6)
- dietrofront(158);
- look();
- }
- drive (68, 0);
- stay();
-
- /* si trasferisce nell' angolo in basso a sinistra */
- while (loc_y() > 530) {
- drive (292, 80);
- if ((damage() - danni) > 6)
- dietrofront(292);
- look();
- }
- drive (292, 50);
- look();
- while (loc_y() > 80 && loc_x() > 80) {
- drive (248, 80);
- if ((damage() - danni) > 6)
- dietrofront(248);
- look();
- }
- drive (248, 0);
- stay();
-
- /* torna nell' angolo in basso a destra */
- while (loc_x() < 470) {
- drive (22, 80);
- if ((damage() - danni) > 6)
- dietrofront(22);
- look();
- }
- drive (22, 50);
- look();
- while (loc_y() > 80 && loc_x() < 920) {
- drive (338, 80);
- if ((damage() - danni) > 6)
- dietrofront(338);
- look();
- }
- drive (338, 0);
- }
- }
-
-
- /* Si guarda intorno e spara */
-
- look ()
- {
- int i, dist2;
-
- if (!(dist = scan (sc_dir, 5))) {
- if (dist = scan(sc_dir -= 10, 5))
- sfas = -6;
- else if (dist = scan(sc_dir -= 15, 10))
- sfas = -10;
- else if (dist = scan(sc_dir += 35, 5))
- sfas = 6;
- else if (dist = scan(sc_dir += 15, 10))
- sfas = 10;
- else {
- i = 10;
- while (!(dist = scan(sc_dir += 20, 10)) && (--i))
- ;
- sfas = 0;
- oldd = dist;
- return;
- }
- }
- if ((dist - oldd) > 0)
- if (cannon(sc_dir + sfas, (dist * 15) / 13))
- sfas = 0;
- else if (cannon(sc_dir + sfas, (dist * 15) / 17))
- sfas = 0;
- dist2 = scan (scd2 -= 20, 10);
- if ((dist2 > 0) && (dist2 < (dist - 50)) ) {
- sc_dir = scd2;
- oldd = dist2;
- } else
- oldd = dist;
- }
-
-
- /* resta fermo finche' non subisce danni per piu' del 6% */
-
- stay()
- {
- danni = damage();
- while ((damage() - danni) <= 6)
- look();
- danni = damage();
- }
-
-
- /* inverte momentaneamente la rotta */
-
- dietrofront (dir)
- int dir; /* attuale direzione di marcia */
- int dir2; /* direzione opposta */
- int i;
- {
- drive (dir, 0);
- look();
- dir2 = dir + 180;
- i = 5;
- while (--i) {
- drive (dir2, 80);
- look();
- }
- drive (dir2, 0);
- danni = damage();
- }
-
-
-